热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

都会|小节_掌握了Tomcat的架构设计,Tomcat就很容易了

篇首语:本文由编程笔记#小编为大家整理,主要介绍了掌握了Tomcat的架构设计,Tomcat就很容易了相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了掌握了Tomcat的架构设计,Tomcat就很容易了相关的知识,希望对你有一定的参考价值。



Tomcat的架构设计

1.Servlet规范


1.1 Servlet作用讲解

  Servlet是JavaEE规范中的一种,主要是为了扩展Java作为Web服务的功能,统一定义了对应的接口,比如Servlet接口,HttpRequest接口,HttpResponse接口,Filter接口。然后由具体的服务厂商来实现这些接口功能,比如Tomcat,jetty等。

 &ems;在规范里面并不会有具体的实现。可以自行看下源码,而在Servlet规范中规定了一个http请求到来的执行处理流程:对应的服务器容器会接收到对应的Http请求,然后解析该请求,然后创建对应的Servlet实例,调用对应init方法来完成初始化,把请求的相关信息封装为HttpServletRequest对象来调用Servlet的service方法来处理请求,然后通过HttpServletResponse封装响应的信息交给容器,响应给客户端。


1.2 Servlet核心API

  我们再来回顾下Servlet中的核心API,这块对我们更好的掌握Tomcat的内容还是非常有帮助的。


API描述
ServletConfig获取servlet初始化参数和servletContext对象。
ServletContext在整个Web应用的动态资源之间共享数据。
ServletRequest封装Http请求信息,在请求时创建。
ServletResponse封装Http响应信息,在请求时创建。

ServletConfig:

  容器在初始化servlet时,为该servlet创建一个servletConfig对象,并将这个对象通过init()方法来传递并保存在此Servlet对象中。核心作用:


  1. 获取初始化信息;
  2. 获取ServletContext对象。

ServletContext

  一个项目只有一个ServletContext对象,可以在多个Servlet中来获取这个对象,使用它可以给多个Servlet传递数据,该对象在Tomcat启动时就创建,在Tomcat关闭时才会销毁!作用是在整个Web应用的动态资源之间共享数据。

  在实际的Servlet开发中,我们会实现HttpServlet接口,在该接口中会实现GenericServlet,而在GenericServlet会实现ServiceConfig接口,从而可以获取ServletContext容器对象

所以在Servlet中我们可以很容易的获取到ServletContext对象,从而完成对应的操作。

public class ServletTwoImpl extends HttpServlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
response.setContentType("text/html;charset=utf-8");
// 1、参数传递
ServletContext servletContext = this.getServletContext() ;
String value = String.valueOf(servletContext.getAttribute("name")) ;
System.out.println("value="+value);
// 2、获取初始化参数
String userName= servletContext.getInitParameter("user-name") ;
System.out.println("userName="+userName);
// 3、获取应用信息
String servletContextName = servletContext.getServletContextName() ;
System.out.println("servletContextName="+servletContextName);
// 4、获取路径
String pathOne = servletContext.getRealPath("/") ;
String pathTwo = servletContext.getRealPath("/WEB-INF/") ;
System.out.println("pathOne="+pathOne+";pathTwo="+pathTwo);
response.getWriter().print("执行:doGet; value:"+value);



1.3 ServletRequest

  HttpServletRequest接口继承ServletRequest接口,用于封装请求信息,该对象在用户每次请求servlet时创建并传入servlet的service()方法,在该方法中,传入的servletRequest将会被强制转化为HttpservletRequest 对象来进行HTTP请求信息的处理。核心作用:


  1. 获取请求报文信息;

  2. 获取网络连接信息;

  3. 获取请求域属性信息。


1.4 ServletResponse

  HttpServletResponse继承自ServletResponse,封装了Http响应信息。客户端每个请求,服务器都会创建一个response对象,并传入给Servlet.service()方法。核心作用:


  1. 设置响应头信息;

  2. 发送状态码;

  3. 设置响应正文;

  4. 重定向;


2.Tomcat的设计

  通过上面Servlet规范的介绍,其实我们发下我们要实现Servlet规范的话,很重要的就得提供一个服务容器来获取请求,解析封装数据,并调用Servlet实例相关的方法。也就是如下图中的部分

  这块的内容其实就是Tomcat,具体的我们来看看。


2.1 什么是Tomcat

  Tomcat是一个容器,用于承载Servlet,那么我们说Tomcat就是一个实现了部分J2EE规范的服务器。J2 EE和Jakarta EE(Eclipse基金会)这两是啥?用于Tomcat10以后都是Jakarta EE,而9之前就是J2EE.


2.2 Tomcat的架构结构

  我们通过上面的分析,知道Tomcat是一个Servlet规范的实现,要接收请求和响应请求,那么具体是如何实现的呢?这块我们可以通过conf下的server.xml得出对应的结论。

  server.xml是Tomcat中最重要的配置文件,server.xml 的每一个元素都对应了Tomcat 中的一个组件 ;通过对xml文件中元素的配置,可以实现对Tomcat中各个组件的控制。因此,学习server.xml文件的配置,对于了解和使用Tomcat至关重要.

官方文档:https://tomcat.apache.org/tomcat-8.5-doc/config/server.html


<Server port&#61;"8005" shutdown&#61;"SHUTDOWN">
<Service name&#61;"Catalina">
<Executor name&#61;"tomcatThreadPool" namePrefix&#61;"catalina-exec-"
maxThreads&#61;"150" minSpareThreads&#61;"4"/>

<Connector port&#61;"8080" protocol&#61;"HTTP/1.1"
connectionTimeout&#61;"20000"
redirectPort&#61;"8443" />


<Connector executor&#61;"tomcatThreadPool"
port&#61;"8080" protocol&#61;"HTTP/1.1"
connectionTimeout&#61;"20000"
redirectPort&#61;"8443" />

<Engine name&#61;"Catalina" defaultHost&#61;"localhost">
<Realm className&#61;"org.apache.catalina.realm.LockOutRealm">

<Realm className&#61;"org.apache.catalina.realm.UserDatabaseRealm"
resourceName&#61;"UserDatabase"/>

Realm>
<Host name&#61;"localhost" appBase&#61;"webapps"
unpackWARs&#61;"true" autoDeploy&#61;"true">

<Valve className&#61;"org.apache.catalina.valves.AccessLogValve" directory&#61;"logs"
prefix&#61;"localhost_access_log" suffix&#61;".txt"
pattern&#61;"%h %l %u %t "%r" %s %b" />

Host>
Engine>
Service>
Server>

极简模式

<Server>
<Service>
<Connector />
<Connector />
<Engine>
<Host>
<Context />
Host>
Engine>
Service>
Server>

梳理出的结构

对应的每个组件的作用。


2.3 组件分类

  官网其实对上面的组件也做了分类:

顶级元素:


  • Server&#xff1a;是整个配置文件的根元素

  • Service:代表一个Engine元素以及一组与之相连的Connector元素

连接器&#xff1a;


  • 代表了外部客户端发送请求到特定Service的接口&#xff1b;同时也是外部客户端从特定Service接收响应的接口。

容器&#xff1a;

  容器的作用是处理Connector接收进来的请求&#xff0c;并产生对应的响应&#xff0c;Engine&#xff0c;Host和Context都是容器&#xff0c;他们不是平行关系&#xff0c;而是父子关系。

每个组件的作用&#xff1a;


  • Engine:可以处理所有请求
  • Host:可以处理发向一个特定虚拟主机的所有请求
  • Context:可以处理一个特定Web应用的所有请求

核心组件的串联关系&#xff1a;

  当客户端请求发送过来后其实是通过这些组件相互之间配合完成了对应的操作。


  • Server元素在最顶层&#xff0c;代表整个Tomcat容器&#xff1b;一个Server元素中可以有一个或多个Service元素
  • Service在Connector和Engine外面包了一层&#xff0c;把它们组装在一起&#xff0c;对外提供服务。一个Service可以包含多个Connector&#xff0c;但是只能包含一个Engine&#xff1b;Connector接收请求&#xff0c;Engine处理请求。
  • Engine、Host和Context都是容器&#xff0c;且Engine包含Host&#xff0c;Host包含Context。每个Host组件代表Engine中的一个虚拟主机&#xff1b;每个Context组件代表在特定Host上运行的一个Web应用.

整体Tomcat的运行架构图


推荐阅读
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 本文详细探讨了 org.apache.hadoop.ha.HAServiceTarget 类中的 checkFencingConfigured 方法,包括其功能、应用场景及代码示例。通过实际代码片段,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 我有一个SpringRestController,它处理API调用的版本1。继承在SpringRestControllerpackagerest.v1;RestCon ... [详细]
  • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文详细介绍了如何在 Android 中使用值动画(ValueAnimator)来动态调整 ImageView 的高度,并探讨了相关的关键属性和方法,包括图片填充后的高度、原始图片高度、动画变化因子以及布局重置等。 ... [详细]
  • 软件工程课堂测试2
    要做一个简单的保存网页界面,首先用jsp写出保存界面,本次界面比较简单,首先是三个提示语,后面是三个输入框,然 ... [详细]
  • 本文详细介绍如何使用 Python 集成微信支付的三种主要方式:Native 支付、APP 支付和 JSAPI 支付。每种方式适用于不同的应用场景,如 PC 网站、移动端应用和公众号内支付等。 ... [详细]
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
author-avatar
一片绿洲053766
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有